package com.zjj.learn.javaplus.pkg03.demo301;

public class TestDemo301_4 {

    public static void main(String[] args) {
        Computer computer = new Computer();
        Mouse mouse = new Mouse("小米鼠标");
        computer.install(mouse);
        computer.uninstall(mouse);


        Keyboard keyboard = new Keyboard("优酷键盘");
        computer.install(keyboard);
        computer.uninstall(keyboard);

    }


    /**
     * 多态真实案例设计：面向对象思想设计一个电脑对象，可以接入2个USB设备
     *               （鼠标，键盘： 实现接入，调用独有功能，拔出）。
     *
     *     分析：
     *         （1）提供2个USB设备。（USB设备必须满足：接入和拔出的功能）
     *         （2）定义一个USB的接口（申明USB设备的规范必须是：实现接入和拔出的功能）
     *         （3）开始定义 2 个真实的实现类代表鼠标标和键盘
     *         （4）定义一个电脑类。
     *     小结：
     *         记住这些面向对象的综合设计案例。
     * 答案：
     * {@link com.zjj.learn.javaplus.pkg03.demo301.USB}
     * {@link com.zjj.learn.javaplus.pkg03.demo301.Mouse}
     * {@link com.zjj.learn.javaplus.pkg03.demo301.Keyboard}
     * {@link com.zjj.learn.javaplus.pkg03.demo301.Computer}
     * {@link com.zjj.learn.javaplus.pkg03.demo301.TestDemo301_4#main(String[])}
     *
     **/
}


class Computer{


    public void install(USB usb){
        usb.connect();
        if(usb instanceof Keyboard){
            Keyboard keyboard = (Keyboard)usb;
            keyboard.knock();
        }else if (usb instanceof Mouse){
            Mouse mouse = (Mouse) usb;
            mouse.click();
        }
    }

    public void uninstall(USB usb){
        usb.unconnect();
    }
}

class Keyboard implements USB{

    private String name;

    public Keyboard() {
    }

    public Keyboard(String name) {
        this.name = name;
    }

    @Override
    public void connect() {
        System.out.println(this.name + "连接到了设备");
    }

    @Override
    public void unconnect() {
        System.out.println(this.name + "和设备取消连接");
    }

    public void knock(){
        System.out.println(this.name + "被敲击了");
    }
}

class Mouse implements USB{

    private String name;

    public Mouse() {
    }

    public Mouse(String name) {
        this.name = name;
    }

    @Override
    public void connect() {
        System.out.println(this.name + "连接到了设备");
    }

    @Override
    public void unconnect() {
        System.out.println(this.name + "和设备取消连接");
    }

    public void click(){
        System.out.println(this.name + "被点击了");
    }
}


/**
 * 定义一个 USB 接口
 **/
interface  USB{

    void connect();
    void unconnect();
}